home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
031-040
/
amok35
/
spellchecker
/
vorüberlegungen
< prev
next >
Wrap
Text File
|
1993-11-04
|
5KB
|
86 lines
Einige Gedanken zur Rechtschreibprüfung.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Der Name Lexikon ist eigentlich nicht ganz korrekt, denn eigentlich handelt
es sich bei diesem Programm mehr um einen Duden. Der Zweck des Programmes
soll es sein, Worte auf ihre korrekte Schreibweise zu überprüfen. Dazu
braucht man eine Liste mit möglichst vielen richtig geschriebenen Worten.
Ist das zu überprüfende Wort in der Liste vorhanden, so wird es als richtig
angesehen, anderenfalls muß der Benutzer entscheiden, ob es richtig ist und
ob es in die Liste aufgenommen werden soll.
Generierung der Liste:
~~~~~~~~~~~~~~~~~~~~~
Die Liste muß in irgendeiner Weise geordnet sein, damit in ihr schnell
gesucht werden kann. Außerdem muß sie eine variable Größe haben, damit man
jederzeit Worte hinzufügen kann. Zuerst habe ich daran gedacht, einen
binären (AVL) Baum zu benutzen. Er hat aber den Nachteil, daß zu jedem Wort
der Liste zwei Zeiger auf Nachfolger gehören. Wird ein Wort als maximal 16
Zeichen lang angenommen, so müssen mit jedem Wort zwei Pointer mit 2*4 =8
Byte im Speicher gehalten werden. Auf 16 Byte Nutzinformation kommen also
mindestens 8 Byte Verwaltungsinformation. Deshalb habe ich mich für ein
sortiertes Array entschieden. Die variable Größe erreiche ich dadurch, daß
ich nicht direkt ein Array benutze, sondern einen Pointer to Array[1..] OF
String. Dann kann man den Speicher mit Allocate dynamisch je nach Bedarf
anfordern. Der Nachteil ist natürlich, daß ich das Array nicht
kontinuierlich vergrößern kann. Ist der allozierte Speicher voll, muß ich
die Liste abspeichern, den alten Speicherbereich freigeben, einen größeren
anfordern und die Liste wieder einlesen. Die Generierung der Liste geht
dann folgendermaßen: Aus Textdateien, welche nur wenig Rechtschreibfehler
enthalten, werden die Worte gelesen und in die Liste einsortiert. Die Liste
enthält nicht nur die Worte selber, sondern auch die Häufigkeit der Worte.
Sind genügend Textdateien (von verschiedenen Autoren) eingelesen, so sollte
die Häufigkeit der richtig geschriebenen Worte die der falsch geschriebenen
recht deutlich übersteigen. Nun braucht man nur noch die Worte geringer
Häufigkeit zu löschen und schon ist die Liste fertig.
Speicherbedarf:
~~~~~~~~~~~~~~~
Wenn man alle möglichen Worte, also Verben mit allen möglichen Endungen und
Vorsilben und auch alle zusammemgesetzten Worte in die Liste aufnehmen
wollte, so müßte man für jedes Wort wohl 30 Bytes vorsehen, und man würde
wohl leicht über 100.000 verschiedene Worte finden. Damit wäre das Array
30*100.000 = 3 MByte groß. Deshalb müssen wir also zusammengesetzte Worte
in ihre Komponenten zerlegen und auch einige Vorsilben (z.B. vor- auf- )
getrennt speichern. Dann müßte eine Wortlänge von ca. 16 Zeichen reichen
und mit ca. 10- 20000 Worten sollte sich dann der Grundwortschatz abdecken
lassen. Damit wäre das Array 10000*16 = 160.000 Bytes groß. Auf Diskette
wird man dann nicht das ganze Array, sondern die einzelnen Worte speichern.
Da die Worte im Mittel kleiner als die Maximallänge von 16 Bytes sind, wird
das File deutlich kleiner als das Array sein.
Stefan Salewski, 11.2.90
Probleme:
~~~~~~~~~
Bei der Generierung des Lexikons sollen zusammengesetzte Wörter in ihre
Komponenten zerlegt werden. Die Zerlegung eines Wortes geschieht
folgendermaßen: Wenn ein Wort in der Liste nicht gefunden wird, wird von
dem Wort solange der letzte Buchstabe abgeschnitten, bis das vordere
Teilstück entweder in der Liste gefunden wird oder leer ist. Wird das
vordere Teilstück gefunden, so wird von dem ursprünglichen Wort dieser
vordere Teil entfernt und mit dem Rest wird in der gleichen Weise
verfahren. Bleibt ein Rest des Wortes übrig, der in der Liste nicht
gefunden wird, so wird der Rest (oder das ganze urspüngliche Wort) in die
Liste übernommen.
Beispiel: Gesucht wird Haustür
Haustür wird nicht gefunden. r-ü-t werden nacheinander abgespalten. Dann
bleibt Haus übrig und wird in der Liste gefunden. Nun wird Haus aus Haustür
herausgelöscht, es bleibt tür. Da Haustür großgeschrieben ist, muß auch das
t von tür in einen großen Buchstaben umgewandelt werden. Es bleibt Tür.
Wird Tür in der Liste gefunden, so ist Haustür also in Komponenten in der
Liste schon vorhanden, andernfalls muß Tür noch eingefügt werden.
Komponenten können natürlich erst dann als solche erkannt werden, wenn sie
schon in der Liste enthalten sind. Deshalb müssen die Quelltexte mehrmals
gelesen werden. Zuerst werden nur Worte übernommen, die nur aus zwei
Buchstaben bestehen, beim nächsten Durchlauf dann die Worte die aus 3
Buchstaben bestehen usw.
Stefan Salewski, 12.2.90